import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
// 状态
const state = {
  token: getToken(),
  //   定义一个空对象，不是null(会引起异常和报错)。后面需开发userInfo的属性给别人用，userInfo.name
  userInfo: {}
}
// 修改状态
const mutations = {
  setToken(state, token) {
    // 设置token，只是修改state数据 vuex变化 - 缓存数据
    state.token = token
    // vuex和缓存数据同步
    setToken(token)
    setTimeStamp()
  },
  //   删除缓存
  removeToken(state) {
    //   删除vuex的token
    state.token = null
    // 先清除vuex，再清除缓存vuex和缓存数据
    removeToken()
  },
  setUserInfo(state, res) {
    state.userInfo = res // 响应式
    // state.userInfo = { ...res }
    // state.userInfo['username'] = res
  },
  removeUserInfo(state) {
    state.userInfo = {}
  }
}
// 执行异步
const actions = {
  // 定义login，action也需要传参数，调用action时，传递过来的参数
  async login(context, data) {
    //   axios默认给数据加了一层data
    const res = await login(data)
    // 接口调用成功=用户名和密码正确
    // 现有的用户token
    // actions修改state务必通过mutations
    // if (res.data.success) return context.commit('setToken', res.data.data)
    context.commit('setToken', res)

    // 设置当前的时间戳
    setTimeStamp()
  },
  async getUserInfo(context) {
    //   res就是用户的基本资料
    const res = await getUserInfo()
    // 为获取头像
    const baseInfo = await getUserDetailById(res.userId)

    // 方法①
    const baseRes = { ...res, ...baseInfo } // 将两个接口结果合并
    context.commit('setUserInfo', baseRes) // 提交到mutations里面
    // 方法②
    // context.commit('setUserInfo', { ...res, ...baseInfo }) // 提交到mutations里面
    return res // 为后面做权限的时候买下伏笔
  },
  logout(context) {
    //  删除token
    context.commit('removeToken')
    // 删除用户信息
    context.commit('removeUserInfo')
  }
}
export default {
  // 命名空间
  namespaced: true,
  state,
  mutations,
  actions
}
